#ifndef SCENE_H
#define SCENE_H

#include <vector>
#include "object.h"
#include "face.h"
#include "vertex.h"
#include "tetrahedron.h"
#include "methods.h"

class Scene{
    public:
        Scene();
        ~Scene();

        void addObject(Object *);
        void deleteObject(Object *);


        void selectTetrahedron(Tetrahedron *);
        void selectVertex(Vertex *);
        void selectEdge(Edge *);
        void selectFace(Face *);
        void selectObject(Object *);

        std::vector<Vertex *> selectConvexHullVertices();
//
//        void selectAdjacentVertices(std::vector<Vertex *>*);
//        void selectAdjacentVV(std::vector<Vertex *>*);
//        void selectAdjacentEV(std::vector<Vertex *>*);
//        void selectAdjacentFV(std::vector<Vertex *>*);
//        void selectAdjacentSV(std::vector<Vertex *>*);
//
//        void selectAdjacentEdges(std::vector<Edge *>*);
//        void selectAdjacentVE(std::vector<Edge *>*);
//        void selectAdjacentEE(std::vector<Edge *>*);
//        void selectAdjacentFE(std::vector<Edge *>*);
//        void selectAdjacentSE(std::vector<Edge *>*);
//
//        void selectAdjacentFaces(std::vector<Face *>*);
//        void selectAdjacentVF(std::vector<Face *>*);
//        void selectAdjacentEF(std::vector<Face *>*);
//        void selectAdjacentFF(std::vector<Face *>*);
//        void selectAdjacentSF(std::vector<Face *>*);
//
//        void selectAdjacentObjects(std::vector<Object *>*);
//        void selectAdjacentVS(std::vector<Object *>*);
//        void selectAdjacentES(std::vector<Object *>*);
//        void selectAdjacentFS(std::vector<Object *>*);
//        void selectAdjacentSS(std::vector<Object *>*);

//        void scale(double);
//        void translate(Point);
        //void rotate(double);

//        bool changeColor(Color);
//        bool sweep(Point);
//        void movePoints(Point);
//
//        bool analyseArea(double*);

        Object *getObject(int);
        std::vector<Object *> getObjects();
        std::vector<Object *> getSelectedObjects();
        int sizeObjects();
        int nextObjectsID();
        int nextVerticesID();

        void draw(bool, bool, bool, bool, bool);
        void drawFace(Face *, bool, bool, bool = true);
        void drawEdge(Edge *);
        void drawVertex(Vertex *);
        void drawTetrahedron(Tetrahedron *, bool, bool);

        void convexHull();
        void tetrahedralization();

    private:
        std::vector<Object *> objects;
        std::vector<Object *> selectedObjects;
        std::vector<Face *> selectedFaces;
        std::vector<Edge *> selectedEdges;
        std::vector<Vertex *> selectedVertices;
        std::vector<Tetrahedron *> selectedTetrahedrons;

        Color selectedColor;
//        Color stepByStepColor;
        int idObjects;
        int idVertices;
        Methods methods;
//        int stepByStepFace;
//        int stepByStepObject;
};

#endif
